package io;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.concurrent.TimeUnit;

public class Basic {

	public static void main(String[] args) throws Exception {
		t6();
	}
	public static void t6() throws Exception{
		PrintWriter pw=new PrintWriter(new File("D:\\printWrite.txt"));
		//pw.write("haha");
		pw.append("aaaaa");
		pw.print("good");
		pw.println("better");
		pw.format("nono%d", 1);
		pw.flush();
		pw.close();
	}
	public static void t5() throws Exception{
		Reader reader = new FileReader("D:\\good.txt");
		int data = reader.read();
		while(data != -1){
		    char dataChar = (char) data;
		    System.out.println(dataChar);
		    data = reader.read();
		}
		reader.close();

	}
	public static void t4() throws Exception{
		//把控制台的文件输出到下面的文件中
		OutputStream output = new FileOutputStream("D:\\system.out.txt",true);
		PrintStream printOut = new PrintStream(output);
		System.setOut(printOut);
		System.out.println("goood");
		//请记住，务必在JVM关闭之前冲刷System.out(译者注：调用flush())，确保System.out把数据输出到了文件中
		printOut.flush();
		//System.setIn(), System.setOut(), System.setErr()方法设置新的系统流

	}
	public static void t3() throws Exception {
		//一字节数组的方式读写
		byte[] bytes="good".getBytes();
		ByteArrayInputStream bais=new ByteArrayInputStream(bytes);
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		int b=0;
		b=bais.read();
		while(b!=-1){
			baos.write(b);
			b=bais.read();
		}
		System.out.println(new String(baos.toByteArray()));
		bais.close();
		baos.close();
	}

	public static void t2() throws Exception {
		/**
		 * 
		 * 	你也可以使用两个管道共有的connect()方法使之相关联。PipedInputStream和PipedOutputStream都拥有一个可以互相关联的connect()方法。
			管道和线程
			请记得，当使用两个相关联的管道流时，务必将它们分配给不同的线程。read()方法和write()方法调用时会导致流阻塞，
			这意味着如果你尝试在一个线程中同时进行读和写，可能会导致线程死锁。
			管道的替代
			除了管道之外，一个JVM中不同线程之间还有许多通信的方式。实际上，线程在大多数情况下会传递完整的对象信息而非原始的字节数据。
			但是，如果你需要在线程之间传递字节数据，Java IO的管道是一个不错的选择。
		 *
		 */
		//管道之间的通信,可以实现多线程通信
		final PipedOutputStream out=new PipedOutputStream();
		final PipedInputStream input=new PipedInputStream(out);
		Thread t1=new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					TimeUnit.SECONDS.sleep(1);
					out.write("我是out".getBytes());
					out.flush();
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
		});
		Thread t2=new Thread(new Runnable() {
			
			@Override
			public void run() {
				byte[] b=new byte[1024];
 				try {
 					//如果有数据了就会调用read
					InputStreamReader isr=new InputStreamReader(input);
					BufferedReader br=new BufferedReader(isr);
					System.out.println(br.readLine());
					br.close();
					isr.close();
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}finally{
					if(input!=null){
						try {
							input.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
				
			}
		});
		t1.start();
		t2.start();
	}

	public static void t1() throws Exception {
		File file = new File("D:/demo.txt");
		InputStream is = new FileInputStream(file);
		OutputStream out = new FileOutputStream("D:/cope.txt");
		byte[] by = new byte[1024];
		int i = is.read(by);
		while (i != -1) {
			System.out.println(new String(by));
			out.write(by);
			i = is.read(by);
		}
		out.close();
		is.close();
	}

}
